package com.tangcco.lockwell.controller.admin;

import cn.hutool.core.io.file.FileNameUtil;

import com.tangcco.lockwell.base.BaseApiController;
import com.tangcco.lockwell.base.RestResponse;
import com.tangcco.lockwell.domain.User;
import com.tangcco.lockwell.service.impl.UserServiceImpl;
import com.tangcco.lockwell.utility.DateToString;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Date;
import java.util.Random;
import java.util.UUID;

@RequestMapping("api/admin/upload")
@RestController("AdminUploadController")
public class UploadController extends BaseApiController {
    @Resource
    UserServiceImpl userService;

    private static final String UPLOAD_PATH = getUploadPath();

    @Value("${common.profile}")
    private String profile;
    //图片上传   这里的图片上传是多要了一个用户Id，主要功能是修改指定用户的头像
    //并不是单纯的图片上传功能。
    @ResponseBody
    @RequestMapping("/configAndUpload")
    public Object upload(@RequestParam(value = "idPic",required = false)MultipartFile idPic,
                         @RequestParam(value = "userId",required = false)Integer UserId,
                         HttpServletRequest request) throws IOException {
        if (!idPic.isEmpty()) {
            System.out.println(UserId);
            // 获取上传路径
            try {
                // 获取上传位置
                Path uploadDir = Paths.get(UPLOAD_PATH);
                // 获取文件名
                String fileName = idPic.getOriginalFilename();
                // 获取扩展名
                String prefix = FileNameUtil.extName(fileName);
                // 生成新文件名
                String newFileName = System.currentTimeMillis() + new Random().nextInt(1000000) + "_Personal." + prefix;
                // 封装文件对象
                File file = new File(uploadDir.toFile(), newFileName);
                // 获取文件路径，修改用户头像保存地址
                User user = userService.getUserById(UserId);
                user.setImagePath(file.getAbsolutePath());
                user.setModifyTime(DateToString.dateToString(new Date()));
                userService.updateByIdFilter(user);
                System.out.println(file.getAbsolutePath());

                //完成文件上传
                idPic.transferTo(file);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return RestResponse.ok();
    }
    //获取图片上传路径
    private static String getUploadPath() {
        //这行代码获取了 UploadController 类的类加载器。类加载器负责加载类和资源文件。
        ClassLoader classLoader = UploadController.class.getClassLoader();
        //这行代码使用类加载器从类路径中查找并获取路径为 static/admin/image 的资源URL。
        // 如果资源存在，返回其URL；如果不存在，返回 null。
        URL resource = classLoader.getResource("static" + "/admin" + "/image");
        if (resource == null) {
            // 记录日志
            System.err.println("资源路径 'static/admin/image' 未找到");
            return "";
        }
        String path = resource.getPath();
        // 去掉开头的斜杠  因为返回的路径基本是 /D:/000/.... 的开头为 / ，图片上传时不认这种，因此要把开头的 / 给去掉
        if (path.startsWith("/")) {
            path = path.substring(1);
        }
        //返回路径
        return path;
    }



    // 处理文件上传的接口
    @PostMapping("/file")
    public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file,
                                             @RequestParam(name = "fileType", required = false ) String fileType) {
        String type = "";
        if(fileType == null || StringUtils.isBlank(fileType)){
            type = "/avatar";
        }else{
            type = "/" + fileType;
        }
        try {
            if (file.isEmpty()) {
                return new ResponseEntity<>("请选择要上传的文件", HttpStatus.BAD_REQUEST);
            }

            // 获取项目根目录下的uploads文件夹作为上传目录（可根据需求调整路径）
            String uploadDirPath = profile +type;
            Path uploadDir = Paths.get(uploadDirPath);
            // 如果文件夹不存在，则创建它
            if (!Files.exists(uploadDir)) {
                Files.createDirectories(uploadDir);
            }

            // 获取原始文件名
            String originalFileName = file.getOriginalFilename();
            // 获取文件后缀名，用于后续构建保存的文件名
            String fileExtension = originalFileName.substring(originalFileName.lastIndexOf("."));
            // 生成新的唯一文件名，避免文件名冲突，这里使用UUID来生成
            String uniqueFileName = UUID.randomUUID().toString() + fileExtension;

            // 构建文件保存的完整路径，包含文件名
            Path filePath = uploadDir.resolve(uniqueFileName);

            // 将文件上传到指定路径
            file.transferTo(new File(filePath.toString()));

            // 返回文件保存后的相对路径（假设前端可以通过该相对路径访问到文件，具体根据实际部署等情况调整）
            String relativeFilePath = type +"/" + uniqueFileName;
            return new ResponseEntity<>(relativeFilePath, HttpStatus.OK);
        } catch (IOException e) {
            e.printStackTrace();
            return new ResponseEntity<>("文件上传失败，请稍后再试", HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }
}
